package agentes09.gestor;

import agentes09.gestor.behaviours.EventoDeControl;
import agentes09.gestor.behaviours.RecibirMensajesGestion;
import jade.core.AID;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Esta clase representa al agente gestor de la simulacion.
 * Su funcion es informar periodicamente de la hora actual y preguntarle
 * a cada agente en la plataforma cual es su situacion (dinero, mercancias),
 * para almacenarlo en una tabla.
 *
 * @author jmcarmona
 */
public class AgenteGestor extends Agent {

    List<AID> agentesRegistrados;

    private static final long NUM_MILLIS_PASO_TIEMPO = 1000;
    private static final long FRECUENCIA_TICKER = 5 * NUM_MILLIS_PASO_TIEMPO;
    //A que hora comenzo la simulacion
    private long horaComienzoSimulacion;

    private SituacionJuego situacionJuegoActual;

    public void anyadirRegistro(AID agente, String tipoAgente, EstadoAgente registro) {
        situacionJuegoActual.anyadirRegistro(agente, tipoAgente, registro);
    }

    
    public long getHoraComienzoSimulacion() {
        return horaComienzoSimulacion;
    }

    public void setHoraComienzoSimulacion(long horaComienzoSimulacion) {
        this.horaComienzoSimulacion = horaComienzoSimulacion;
    }

    public List<AID> getAgentesRegistrados() {
        return agentesRegistrados;
    }

    public void setAgentesRegistrados(List<AID> agentesRegistrados) {
        this.agentesRegistrados = agentesRegistrados;
    }

    public SituacionJuego getSituacionJuegoActual() {
        return situacionJuegoActual;
    }

    public void setSituacionJuegoActual(SituacionJuego situacionJuegoActual) {
        this.situacionJuegoActual = situacionJuegoActual;
    }

    @Override
    protected void setup() {
        System.out.println("El agente gestor ha comenzado");
        horaComienzoSimulacion = new Date().getTime();
        registrarEnDF();
        addBehaviour(new EventoDeControl(this, FRECUENCIA_TICKER));
        addBehaviour(new RecibirMensajesGestion(this));
    }

    /**
     * Este metodo registra al agente gestor en el DF
     */
    private void registrarEnDF() {
        DFAgentDescription dfd = new DFAgentDescription();
        dfd.setName(getAID());
        ServiceDescription sd = new ServiceDescription();
        sd.setType("gestor");
        sd.setName(getLocalName());
        dfd.addServices(sd);
        try {
            DFService.register(this, dfd);
        } catch (FIPAException fe) {
            fe.printStackTrace();
        }
    }


    /**
     * Esta funcion devuelve cual es la hora actual para la simulacion. La hora es un long.
     * Al principio de la simulacion, la hora es 0, y cada NUM_MILLIS_PASO_TIEMPO milisegundos
     *  de tiempo real se incrementa en una unidad.
     * @return
     */
    public long getTiempoActual() {
        return (new Date().getTime() - horaComienzoSimulacion) / NUM_MILLIS_PASO_TIEMPO;
    }

    public void imprimirSituacion() {

    }

    public void reiniciarAgentesRegistrados() {
        agentesRegistrados = new ArrayList<AID>();
    }
}
